package binary

func U8(b []byte) (i uint8) {
	isOK := assert(len(b) > 0, "param array lenght < 1")
	if !isOK {
		return 0
	}
	return b[0]
}

func U8Ex(b []byte) (i uint8, ret bool) {
	isOK := assert(len(b) > 0, "param array lenght < 1")
	if !isOK {
		i = 0
		ret = false
		return
	}
	i = b[0]
	ret = true
	return
}

func U16BE(b []byte) (i uint16) {
	isOK := assert(len(b) >= 2, "param array lenght < 2")
	if !isOK {
		i = 0
		return
	}
	i = uint16(b[0])
	i <<= 8
	i |= uint16(b[1])
	return
}

func U16BE_Ex(b []byte) (i uint16, ret bool) {
	isOK := assert(len(b) >= 2, "param array length < 2")
	if !isOK {
		i = 0
		ret = false
		return
	}
	i = U16BE(b)
	ret = true
	return
}

func I16BE(b []byte) (i int16) {
	isOK := assert(len(b) >= 2, "param array length < 2")
	if !isOK {
		i = -1
		return
	}

	i = int16(b[0])
	i <<= 8
	i |= int16(b[1])
	return
}
func I16BE_Ex(b []byte) (i int16, ret bool) {
	isOK := assert(len(b) >= 2, "param array length < 2")
	if !isOK {
		i = -1
		ret = false
		return
	}

	i = I16BE(b)
	ret = true
	return
}

func I24BE(b []byte) (i int32) {
	isOK := assert(len(b) >= 3, "param array length < 3")
	if !isOK {
		i = -1
		return
	}
	i = int32(int8(b[0]))
	i <<= 8
	i |= int32(b[1])
	i <<= 8
	i |= int32(b[2])
	return
}


func I24BE_Ex(b []byte) (i int32, ret bool) {
	isOK := assert(len(b) >= 3, "param array length < 3")
	if !isOK {
		i = -1
		ret = false
		return
	}
	i = I24BE(b)
	ret = true
	return
}

func U24BE(b []byte) (i uint32) {
	isOK := assert(len(b) >= 3, "param array length < 3")
	if !isOK {
		i = 0
		return
	}
	i = uint32(b[0])
	i <<= 8
	i |= uint32(b[1])
	i <<= 8
	i |= uint32(b[2])
	return
}

func U24BE_Ex(b []byte) (i uint32, ret bool) {
	isOK := assert(len(b) >= 3, "param array length < 3")
	if !isOK {
		i = 0
		ret = false
		return
	}
	i = U24BE(b)
	ret = true
	return
}

func I32BE(b []byte) (i int32) {
	isOK := assert(len(b) >= 4, "param array length < 4")
	if !isOK {
		i = -1
		return
	}
	i = int32(int8(b[0]))
	i <<= 8
	i |= int32(b[1])
	i <<= 8
	i |= int32(b[2])
	i <<= 8
	i |= int32(b[3])
	return
}

func I32BE_Ex(b []byte) (i int32, ret bool) {
	isOK := assert(len(b) >= 4, "param array length < 4")
	if !isOK {
		i = -1
		ret = false
		return
	}
	i = I32BE(b)
	ret = true
	return
}

func U32LE(b []byte) (i uint32) {
	isOK := assert(len(b) >= 4, "param array length < 4")
	if !isOK {
		i = 0
		return
	}
	i = uint32(b[3])
	i <<= 8
	i |= uint32(b[2])
	i <<= 8
	i |= uint32(b[1])
	i <<= 8
	i |= uint32(b[0])
	return
}

func U32LE_Ex(b []byte) (i uint32, ret bool) {
	isOK := assert(len(b) >= 4, "param array length < 4")
	if !isOK {
		i = 0
		ret = false
		return
	}
	i = U32LE(b)
	ret = true
	return
}

func U32BE(b []byte) (i uint32) {
	isOK := assert(len(b) >= 4, "param array length < 4")
	if !isOK {
		i = 0
		return
	}
	i = uint32(b[0])
	i <<= 8
	i |= uint32(b[1])
	i <<= 8
	i |= uint32(b[2])
	i <<= 8
	i |= uint32(b[3])
	return
}

func U32BE_Ex(b []byte) (i uint32, ret bool) {
	isOK := assert(len(b) >= 4, "param array length < 4")
	if !isOK {
		i = 0
		ret = false
		return
	}
	i = U32BE(b)
	ret = true
	return
}

func U40BE(b []byte) (i uint64) {
	isOK := assert(len(b) >= 5, "param array length < 5")
	if !isOK {
		i = 0
		return
	}
	i = uint64(b[0])
	i <<= 8
	i |= uint64(b[1])
	i <<= 8
	i |= uint64(b[2])
	i <<= 8
	i |= uint64(b[3])
	i <<= 8
	i |= uint64(b[4])
	return
}

func U40BE_Ex(b []byte) (i uint64, ret bool) {
	isOK := assert(len(b) >= 5, "param array length < 5")
	if !isOK {
		i = 0
		ret = false
		return
	}
	i = U40BE(b)
	ret = true
	return
}

func U64BE(b []byte) (i uint64) {
	isOK := assert(len(b) >= 8, "param array length < 8")
	if !isOK {
		i = 0
		return
	}
	i = uint64(b[0])
	i <<= 8
	i |= uint64(b[1])
	i <<= 8
	i |= uint64(b[2])
	i <<= 8
	i |= uint64(b[3])
	i <<= 8
	i |= uint64(b[4])
	i <<= 8
	i |= uint64(b[5])
	i <<= 8
	i |= uint64(b[6])
	i <<= 8
	i |= uint64(b[7])
	return
}

func U64BE_Ex(b []byte) (i uint64, ret bool) {
	isOK := assert(len(b) >= 8, "param array length < 8")
	if !isOK {
		i = 0
		ret = false
		return
	}
	i = U64BE(b)
	ret = true
	return
}

func I64BE(b []byte) (i int64) {
	isOK := assert(len(b) >= 8, "param array length < 8")
	if !isOK {
		i = -1
		return
	}
	i = int64(int8(b[0]))
	i <<= 8
	i |= int64(b[1])
	i <<= 8
	i |= int64(b[2])
	i <<= 8
	i |= int64(b[3])
	i <<= 8
	i |= int64(b[4])
	i <<= 8
	i |= int64(b[5])
	i <<= 8
	i |= int64(b[6])
	i <<= 8
	i |= int64(b[7])
	return
}

func I64BE_Ex(b []byte) (i int64, ret bool) {
	isOK := assert(len(b) >= 8, "param array length < 8")
	if !isOK {
		i = -1
		ret = false
		return
	}
	i = I64BE(b)
	ret = true
	return
}